﻿using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Text;
using com.clinica.business.BE.gesliq;
using com.clinica.business.BL.interfaces.gesliq;
using com.clinica.DL.sql.gesliq;
using com.clinica.business.entities;
using System.Configuration;

namespace com.clinica.business.BL.gesliq
{
    [ServiceBehavior(Name = "LiquidacionBL",
   Namespace = "http://com.clinica.business.BL.interfaces.gesliq",
   ConcurrencyMode = ConcurrencyMode.Multiple,
   InstanceContextMode = InstanceContextMode.PerSession,
   IncludeExceptionDetailInFaults = true)]
    public class LiquidacionBL : ILiquidacionBL
    {

        #region ILiquidacion Members

        public List<LiquidacionBE> ObternerLiquidaciones(LiquidacionBE request, DateTime dtFecha_Inicio, DateTime dtFecha_Fin)
        {
            /****************************************************************************************
             * Sistema    : Sistema de Gestión de Clinica
             * Modulo     : Facturación y Presupuestos
             * Descripción: Obtener lista de liquidaciones
             * Autor      : JPEREZ
             * Fecha      : 2011-06-01
             ****************************************************************************************/
            List<LiquidacionBE> lstLiquidaciones = new List<LiquidacionBE>();
            try
            {
                lstLiquidaciones = LiquidacionDL.ObtenerLiquidaciones(request, dtFecha_Inicio,dtFecha_Fin);
                foreach (LiquidacionBE item in lstLiquidaciones)
                {
                    if(item.FechaEmision!=null)
                      item.FechaEmisionVista = item.FechaEmision.ToString("dd/MM/yyyy").Substring(0, 10);
                }
                
            }
            catch (Exception ex)
            {
                FaultReason err = new FaultReason(ex.Message);
                throw new FaultException(err);
                //new ErrorSGC(1,ex.Message)
            }

            return lstLiquidaciones;
        }

        #endregion



        #region ILiquidacionBL Members


        public LiquidacionBE ActualizarLiquidaciones(LiquidacionBE request)
        {
            /****************************************************************************************
             * Sistema    : Sistema de Gestión de Clinica
             * Modulo     : Facturación y Presupuestos
             * Descripción: Actualizar Liquidaciones por Estado
             * Autor      : JPEREZ
             * Fecha      : 2011-06-01
             ****************************************************************************************/
            LiquidacionBE result = new LiquidacionBE();
            try
            {
               result=  LiquidacionDL.MantenimientoLiquidaciones(request);
            }
            catch (Exception ex)
            {
                FaultReason err = new FaultReason(ex.Message);
                throw new FaultException(err);
                //new ErrorSGC(1,ex.Message)
            }
            return result;
        }

        #endregion

        #region ILiquidacionBL Members


        public List<OrdenAtencionBE> ObtenerLiquidacion(LiquidacionBE request)
        {
            /****************************************************************************************
             * Sistema    : Sistema de Gestión de Clinica
             * Modulo     : Facturación y Presupuestos
             * Descripción: Obtener datos de una liquidación
             * Autor      : JPEREZ
             * Fecha      : 2011-06-01
             ****************************************************************************************/
            List<OrdenAtencionBE> lst = new List<OrdenAtencionBE>();
            try
            {
                decimal decTotCoseguro = 0;
                decimal decTotDeducibles = 0;
                decimal decTotPrecio = 0;
                decimal decTotDescuento = 0;
                decimal decTotIgv = 0;
                decimal decTotNeto = 0;
                decimal decPorcIGV = 0;
                ParametrosBE oparm = new ParametrosBE();
                List<ParametrosBE> lstParm = new List<ParametrosBE>();
                lst = LiquidacionDL.ObtenerLiquidacion(request);
                oparm.NombreTabla = "MONIGV";
                lstParm = ParametrosDL.ObtenerTabla(oparm);

                if (lstParm.Count >= 0)
                    try
                    {
                        decPorcIGV = decimal.Parse(lstParm[0].DescripcionCorta.Trim()) / decimal.Parse("100");
                    }
                    catch (Exception)
                    {
                        decPorcIGV = decimal.Parse(ConfigurationManager.AppSettings.Get("IGV"));
                    }
                foreach (OrdenAtencionBE item in lst)
                {
                    if (item.FechaCorte != null)
                        item.FechaCorteVista = item.FechaCorte.ToString("dd/MM/yyyy").Substring(0, 10);
                    decTotCoseguro = decTotCoseguro + item.CoSeguro;
                    decTotDeducibles = decTotDeducibles + item.Deducible;
                    decTotPrecio = decTotPrecio + item.Precio;
                    decTotDescuento = decTotDescuento + item.Descuento;
                }
                decTotIgv = (decTotPrecio - decTotDescuento) * decPorcIGV;
                decTotNeto = decTotPrecio - decTotDescuento + decTotIgv;
                foreach (OrdenAtencionBE item2 in lst)
                {
                    item2.TotalBruto = (decTotPrecio - decTotDescuento);
                    item2.Totalcoseguro = decTotCoseguro;
                    item2.TotalDeducibles = decTotDeducibles;
                    item2.TotalNeto = decTotNeto;
                    item2.TotalIgv = decTotIgv;
                }

            }
            catch (Exception ex)
            {
                FaultReason err = new FaultReason(ex.Message);
                throw new FaultException(err);
                //new ErrorSGC(1,ex.Message)
            }
            return lst;
        }

        #endregion


        #region ILiquidacionBL Members


        public void AnularLiquidacion(LiquidacionBE request)
        {
            /****************************************************************************************
             * Sistema    : Sistema de Gestión de Clinica
             * Modulo     : Facturación y Presupuestos
             * Descripción: Anular liquidación
             * Autor      : JPEREZ
             * Fecha      : 2011-06-01
             ****************************************************************************************/

            try
            {
              LiquidacionDL.AnularLiquidacion(request);
            }
            catch (Exception ex)
            {
                FaultReason err = new FaultReason(ex.Message);
                throw new FaultException(err);
                //new ErrorSGC(1,ex.Message)
            }
        }

        #endregion

        #region ILiquidacionBL Members


        public List<LiquidacionBE> ObternerLiquidacionesXEstado(LiquidacionBE request, DateTime dtFecha_Inicio, DateTime dtFecha_Fin)
        {
            /****************************************************************************************
             * Sistema    : Sistema de Gestión de Clinica
             * Modulo     : Facturación y Presupuestos
             * Descripción: Obtener lista de liquidaciones por estado
             * Autor      : JPEREZ
             * Fecha      : 2011-06-01
             ****************************************************************************************/

            List<LiquidacionBE> lstLiquidaciones = new List<LiquidacionBE>();
            try
            {
                lstLiquidaciones = LiquidacionDL.ObtenerLiquidacionesXEstado(request, dtFecha_Inicio, dtFecha_Fin);
                foreach (LiquidacionBE item in lstLiquidaciones)
                {
                    if (item.FechaEmision != null)
                        item.FechaEmisionVista = item.FechaEmision.ToString("dd/MM/yyyy").Substring(0, 10);
                }

            }
            catch (Exception ex)
            {
                FaultReason err = new FaultReason(ex.Message);
                throw new FaultException(err);
                //new ErrorSGC(1,ex.Message)
            }

            return lstLiquidaciones;
        }
        public void AprobarLiquidacion(LiquidacionBE request)
        {
            /****************************************************************************************
             * Sistema    : Sistema de Gestión de Clinica
             * Modulo     : Facturación y Presupuestos
             * Descripción: Realizar Aprobación de una liquidación
             * Autor      : JPEREZ
             * Fecha      : 2011-06-01
             ****************************************************************************************/

            try
            {
                LiquidacionDL.AprobarLiquidacion(request);
            }
            catch (Exception ex)
            {
                FaultReason err = new FaultReason(ex.Message);
                throw new FaultException(err);
                //new ErrorSGC(1,ex.Message)
            }
        }
        public void RechazarLiquidacion(LiquidacionBE request)
        {
            /****************************************************************************************
             * Sistema    : Sistema de Gestión de Clinica
             * Modulo     : Facturación y Presupuestos
             * Descripción: Realizar Aprobación de una liquidación
             * Autor      : JPEREZ
             * Fecha      : 2011-07-03
             ****************************************************************************************/

            try
            {
                LiquidacionDL.RechazarLiquidacion(request);
            }
            catch (Exception ex)
            {
                FaultReason err = new FaultReason(ex.Message);
                throw new FaultException(err);
                //new ErrorSGC(1,ex.Message)
            }
        }
        #endregion

    }
}
